// 引入vuex
import store from '@/stores'
import {checkUpdateApkRequest} from "@/net/Api";
import * as Url from "@/net/Url";

// #ifdef APP-PLUS
const osName = uni.getSystemInfoSync().osName;
const ANDROID = 'android';

/**
 * 更新APP
 * 1、： 比对服务端版本与APP版本是否匹配， 是 无需更新   否 需要更新
 * 2、： 更新分为两种 强制更新(有SDK或原生组件)  静默更新
 * 3、:  注意：只支持APP更新
 */
export function updateApp() {
    plus.runtime.getProperty(plus.runtime.appid, (widgetInfo) => {
        console.log("版本更新")
        // 更新请求
        checkUpdateApkRequest("app").then((res) => {
            let result = res.data[0]
            const sysVersion = result.sysVersion // 服务器版本号
            const updateType = result.updateType // apk 全量更新  hot 增量更新
            let downloadUrl = updateType === "apk" ? Url.FILE_HOST + result.apkUrl : Url.FILE_HOST + result.hotUrl
            const widgetVersion = widgetInfo.version
            //保存应用版本号
            store.commit('APK_VERSION', widgetVersion)

            console.log("数据库版本号 = " + sysVersion + "，当前应用版本号 = " + widgetVersion + "，文件路径 = " + downloadUrl);

            // Android系统
            if (osName === ANDROID) {
                // 服务器版本号大于当前版本号 要更新
                let flag = compareVersion(sysVersion, widgetVersion);
                console.log("flag", flag);
                if (flag) {
                    // 静默更新
                    downloadFile(downloadUrl);
                }
            }

        }).catch((err) => {
            console.error("更新检查失败 err = ", err);
        })
    });
}

/**
 * 下载安装文件
 * 有SDK等原生组件更新需要强制更新
 */
export function downloadFile(url) {
    const downloadTask = uni.downloadFile({
        url: url,
        timeout: 30000, // 30秒超时时间
        success: (res) => {
            // 下载成功
            if (res.statusCode === 200) {
                console.error('下载成功 安装软件');
                // 安装软件
                plus.runtime.install(
                    res.tempFilePath, {
                        force: true
                    },
                    function (res) {
                        //重启应用
                        plus.runtime.restart();
                        console.error('安装成功 重启应用');
                    },
                    function (e) {
                        console.error('安装失败');
                    }
                );
            }
        },
        fail: (err) => {
            console.log("下载失败 err = ", err)
            otherUpdate()
        }
    });

    //监听下载进度
    downloadTask.onProgressUpdate(res => {
        // let progress = res.progress + '%'
        console.log('下载进度百分比:' + res.progress); // 下载进度百分比
        // console.log('已经下载的数据长度:' + res.totalBytesWritten); // 已经下载的数据长度，单位 Bytes
        // console.log('预期需要下载的数据总长度:' + res.totalBytesExpectedToWrite); // 预期需要下载的数据总长度，单位 Bytes
    });
}

/**
 * 其他方式更新
 */
export function otherUpdate() {
    switch (uni.getSystemInfoSync().platform) {
        case ANDROID:
            // 安卓打开网页下载
            plus.runtime.openUrl("");
            console.log("安卓打开网页下载")
            break;
    }
}

/**
 * 版本号对比
 */
function compareVersion(v1, v2) {
    const v1Parts = v1.split('.').map(Number);
    const v2Parts = v2.split('.').map(Number);
    const numLength = Math.max(v1Parts.length, v2Parts.length)

    for (let i = 0; i < numLength; i++) {
        if (v1Parts[i] > v2Parts[i]) return true;
        if (v1Parts[i] < v2Parts[i]) return false;
    }
    return false;
}

// #endif

